﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using ObjetoNegocio;

namespace Banco
{
    public class AvaliacaoBD:BancoAbstrato<Avaliacao>
    {

        public override bool Remover(Avaliacao t)
        {
            throw new System.NotImplementedException();
        }

        public override bool Atualizar(Avaliacao t)
        {
            throw new System.NotImplementedException();
        }


        public override List<Avaliacao> Listar()
        {
            ComandoSql("[dbo].[cons_TBL_Avaliacao]", CommandType.StoredProcedure);
            return ExecutarConsultarListagem();
        }

        public override List<Avaliacao> ListarPorFiltro(Avaliacao avaliacao)
        {
            const decimal codigo = default(decimal);
            ComandoSql("[dbo].[cons_TBL_BuscaPorFiltro]", CommandType.StoredProcedure);
            AdicionarParametroNulo("@dataCriacao", avaliacao.Data);
            AdicionarParametroNulo("@gostou", avaliacao.Gostou);

            if (avaliacao.Algoritmo != null)
            {
                AdicionarParametroNulo("@codAlgoritmo", avaliacao.Algoritmo.Codigo);
            }else
            {
                AdicionarParametroNulo("@codAlgoritmo", codigo);
            }

            if (avaliacao.Busca != null)
            {
                AdicionarParametroNulo("@codBusca", avaliacao.Busca.Codigo);
            }
            else
            {
                AdicionarParametroNulo("@codBusca", codigo);
            }

            if (avaliacao.Usuario != null)
            {
                AdicionarParametroNulo("@codUsuario", avaliacao.Usuario.Codigo);
            }
            else
            {
                AdicionarParametroNulo("@codUsuario", codigo);
            }

            
            return ExecutarConsultarListagem();
        }

        public override Avaliacao Pesquisar(Avaliacao avaliacao)
        {
            ComandoSql("[dbo].[cons_TBL_AvaliacaoPorFiltro]", CommandType.StoredProcedure);
            AdicionarParametroNulo("@codUsuario", avaliacao.Usuario.Codigo);
            AdicionarParametroNulo("@codAlgoritmo", avaliacao.Algoritmo.Codigo);
            AdicionarParametroNulo("@codBusca", avaliacao.Busca.Codigo);
            AdicionarParametroNulo("@gostou", avaliacao.Gostou);
            AdicionarParametroNulo("@dataCriacao", avaliacao.Data);
            return ExecutarConsultaObjeto();
        }

        public override void Inserir(Avaliacao avaliacao)
        {

            ComandoSql("[dbo].[ins_TBL_Avaliacao]", CommandType.StoredProcedure);
            AdicionarParametro("@dataCriacao", avaliacao.Data);
            AdicionarParametro("@gostou", avaliacao.Gostou);
            AdicionarParametro("@codUsuario", avaliacao.Usuario.Codigo);
            AdicionarParametro("@codAlgoritmo", avaliacao.Algoritmo.Codigo);
            AdicionarParametro("@codBusca", avaliacao.Busca.Codigo);
            ExecutarComando();
           
        }

        public override bool Existe(Avaliacao t)
        {
            throw new System.NotImplementedException();
        }

        protected override void MontarObjeto(ref Avaliacao avaliacao, IDataReader reader)
        {
            var usuarioBD = new UsuarioBD();
            var algoritmoBD = new AlgoritmoBD();
            var buscaBD = new BuscaBD();

            if (reader["DATA_CRIACAO"] != DBNull.Value)
            {
                avaliacao.Data = (DateTime)reader["DATA_CRIACAO"];
            }

            if (reader["GOSTOU"] != DBNull.Value)
            {
                avaliacao.Gostou = (bool)reader["GOSTOU"];
            }

            if (reader["CODIGO_USUARIO"] != DBNull.Value)
            {
                var usuario = new Usuario {Codigo = ((decimal) reader["CODIGO_USUARIO"])};
                avaliacao.Usuario = usuarioBD.Pesquisar(usuario);
            }

            if (reader["CODIGO_ALGORITMO"] != DBNull.Value)
            {
                var algoritmo = new Algoritmo { Codigo = ((decimal)reader["CODIGO_ALGORITMO"]) };
                avaliacao.Algoritmo = algoritmoBD.Pesquisar(algoritmo);
            }

            if (reader["CODIGO_BUSCA"] != DBNull.Value)
            {
                var busca = new Busca { Codigo = ((decimal)reader["CODIGO_BUSCA"]) };
                avaliacao.Busca = buscaBD.Pesquisar(busca);
            }
            
        }
    }
}
